package com.yidu.ladder.system.service.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.yidu.ladder.base.domain.Role;
import com.yidu.ladder.base.domain.RoleVo;
import com.yidu.ladder.system.dao.PowerDao;
import com.yidu.ladder.system.domain.Resource;
import com.yidu.ladder.system.domain.RoleRsource;
import com.yidu.ladder.system.domain.User;
import com.yidu.ladder.system.domain.UserRole;
import com.yidu.ladder.system.domain.UserVo;
import com.yidu.ladder.system.service.PowerService;
import com.yidu.ladder.util.IDGenerator;

/**
 * 权限业务逻辑实现类
 * @author ld
 *
 */
@Service
public class PowerServiceImpl implements PowerService {
	
	@javax.annotation.Resource
	private PowerDao powerDao;
	
	@Override
	public List<String> queryUserHasRoleId(String userId) {
		//查询用户拥有角色根据用户ID
		return powerDao.findUserHasRoleIdByUserId(userId);
	}
	
	@Override
	public List<String> queryRoleHasResourceId(String roleId) {
		//查询角色拥有资源根据角色ID
		return powerDao.findRoleHasResourceIdByRoleId(roleId);
	}
	
	@Override
	public Map<String, Object> queryUser(UserVo userVo) {
		//计算分页条件
		userVo.setPage((userVo.getPage() - 1) * userVo.getLimit());
		//查询角色
		List<User> userList = powerDao.findUserSelective(userVo);
		//查询角色数量
		int count = powerDao.findUserCount(userVo);
		//定义返回数据的格式
		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("code", 0);
		resultMap.put("msg", "");
		resultMap.put("data", userList);
		resultMap.put("count", count);
		return resultMap;
	}

	@Override
	public Map<String, Object> queryRole(RoleVo roleVo) {
		//计算分页条件
		roleVo.setPage((roleVo.getPage() - 1) * roleVo.getLimit());
		//查询角色
		List<Role> roleList = powerDao.findRoleSelective(roleVo);
		//查询角色数量
		int count = powerDao.findRoleCount(roleVo);
		//定义返回数据的格式
		Map<String, Object> resultMap = new HashMap<String, Object>();
		resultMap.put("code", 0);
		resultMap.put("msg", "");
		resultMap.put("data", roleList);
		resultMap.put("count", count);
		return resultMap;
	}
	
	@Override
	public boolean updateUserRole(String userId, String[] roleIds, String flag) {
		//判断是否有角色ID
		if (roleIds.length <= 0) {
			return false;
		}
		//根据标记判断是进行添加还是删除
		if ("insert".equals(flag)) {
			//定义集合存储用户角色
			List<UserRole> userRoleList = new ArrayList<UserRole>();
			//遍历调用方法进行添加
			for (String roleId : roleIds) {
				//创建用户角色对象 并构造赋值
				UserRole userRole = new UserRole(IDGenerator.getId(), userId, roleId);
				//将生成的用户角色添加进入集合
				userRoleList.add(userRole);
			}
			//调用添加用户角色方法
			int addResult = powerDao.insertUserRole(userRoleList);
			//是否添加成功
			if (addResult != roleIds.length) {
				return false;
			}
		} else {
			//定义Map集合用于传参
			Map<String, Object> paramMap = new HashMap<String, Object>();
			//添加用户ID
			paramMap.put("userId", userId);
			//添加角色ID数组
			paramMap.put("roleIds", roleIds);
			//调用删除用户角色方法
			int deleteResult = powerDao.deleteUserRoleByURId(paramMap);
			//是否删除成功
			if (deleteResult != roleIds.length) {
				return false;
			}
		}
		return true;
	}
	
	@Override
	public boolean updateRoleResource(String roleId, String[] resourceIds) {
		//调用删除某个角色所有资源的方法
		powerDao.deleteRoleResourceByRoleId(roleId);
		//判断是否要进行添加
		if (resourceIds != null && resourceIds.length != 0) {
			//定义集合存储角色资源
			List<RoleRsource> roleRsourceList = new ArrayList<RoleRsource>();
			//遍历调用方法进行添加
			for (String resourceId : resourceIds) {
				//创建角色资源对象 并构造赋值
				RoleRsource roleRsource = new RoleRsource(IDGenerator.getId(), roleId, resourceId);
				//将生成的角色资源加入集合
				roleRsourceList.add(roleRsource);
			}
			//调用添加方法
			int addResult = powerDao.insertRoleResource(roleRsourceList);
			//是否添加成功
			if (addResult != resourceIds.length) {
				return false;
			}
		}
		return true;
	}

	@Override
	public List<Role> queryAllRole() {
		//查询所有角色
		return powerDao.findAllRole();
	}

	@Override
	public List<Resource> queryAllResource() {
		//查询所有资源
		return powerDao.findAllResource();
	}

	@Override
	public List<Resource> queryUserHasResource(String userId) {
		//查询资源根据资用户ID
		return powerDao.findResourceByUserId(userId);
	}

	@Override
	public List<String> queryUserHasResourceBtn(String userId, String resourceName) {
		//传递参数 用户Id和资源名
		Map<String, String> map = new HashMap<String, String>();
		map.put("userId", userId);
		map.put("resourceName", resourceName);
		//查询按钮资源根据
		return powerDao.findBtnResourceByUserIdAndResourceName(map);
	}

}
